/**
 * @file Threadpool.hpp
 * @brief 线程池类的声明
 * @details 管理一组工作线程，处理任务队列中的任务
 */

#ifndef __Threadpool_HPP__
#define __Threadpool_HPP__

#include "Task.hpp"
#include "TaskQueue.hpp"
#include "Thread.hpp"

#include <memory>
#include <vector>

using std::unique_ptr;
using std::vector;

namespace wd
{

/**
 * @class Threadpool
 * @brief 线程池类
 * @details 管理固定数量的工作线程，从任务队列中取任务并执行
 */
class Threadpool
{
public:
    /**
     * @brief 构造函数
     * @param threadNum 线程数量
     * @param queSize 任务队列大小
     */
    Threadpool(size_t threadNum, size_t queSize);
    ~Threadpool();

    /**
     * @brief 启动线程池
     */
    void start();
    
    /**
     * @brief 停止线程池
     */
    void stop();
    
    /**
     * @brief 添加任务到任务队列
     * @param task 要执行的任务
     */
    void addTask(Task task);
    
private:
    /**
     * @brief 每个子线程执行的函数
     */
    void doTask();

private:
    vector<unique_ptr<Thread>> _threads;  ///< 工作线程数组
    size_t                     _threadNum;  ///< 线程数量
    TaskQueue                  _taskque;    ///< 任务队列
    bool                       _isExit;     ///< 退出标志

};

}//end of namespace wd


#endif

